package com.miage.itrading.utils;

import java.awt.Color;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

import com.miage.itrading.entites.Cotation;


public final class Util {
	/**
	 * Les cotations sont conservées dans ce cache pour éviter des aller-retours avec la base de données
	 */
	private static ArrayList<Cotation>	cacheCotations = new ArrayList<Cotation>();
	
	
	/**
	 * Si l'on est en dehors des horaires d'ouverture de la bourse :
	 * - avant 9h00, après 17h35, samedi ou dimanche
	 * le temps réel est mis en pause jusqu'à la prochaine ouverture supposée
	 * 
	 * @var durée en millisecondes jusqu'à la prochaine ouverture
	 */
	public static long tempsReelPause = 0L;
	
	
	public static Cotation getCotation(int id) {
		Cotation retour = new Cotation();
		
		for (Cotation c : cacheCotations) {
			if (c.getIdCotation() == id) {
				retour = c;
				break;
			}
		}
		return retour;	
	}
	
	public static Cotation getCotation(String s) {
		Cotation retour = new Cotation();
		
		for (Cotation c : cacheCotations) {
			if (c.getNom().contentEquals(s) || c.getMnemonique().contentEquals(s) || c.getMnemonique2().contentEquals(s)) {
				retour = c;
				break;
			}
		}
		return retour;	
	}
	
	
	
	public static boolean isCotationCached(int id) {
		boolean trouve = false;
		
		for (Cotation c : cacheCotations) {
			if (c.getIdCotation() == id) {
				trouve = true;
				break;
			}
		}
		
		if (trouve) {
			System.out.println(id + " est en cache");	
		}
		else {
			System.out.println(id + " n'est pas en cache");
		}
		
		
		return trouve;	
	}
	
	public static boolean isCotationCached(String s) {
		boolean trouve = false;
		
		for (Cotation c : cacheCotations) {
			if (c.getNom().contentEquals(s) || c.getMnemonique().contentEquals(s) || c.getMnemonique2().contentEquals(s)) {
				trouve = true;
				break;
			}
		}
		
		return trouve;	
	}
	
	public static void addCotationCache(Cotation c) {
		addCotationCache(c, false);
	}
	
	public static void addCotationCache(Cotation c, boolean skipVerif) {
		boolean dejaEnCache = skipVerif;
		
		for (int i=0 ; i<cacheCotations.size() && !dejaEnCache ; ++i) {
			if (cacheCotations.get(i).getNom().contentEquals(c.getNom())) {
				cacheCotations.add(i, c);
				dejaEnCache = true;
				break;
			}
		}
		
		if (!dejaEnCache) {
			cacheCotations.add(c);
		}
	}
	

	public static java.util.Date getDateBySQL(java.sql.Timestamp ts) {
		if (ts.equals(null) == false) {
			return new java.util.Date(ts.getTime());
		} else {
			return null;
		}
	}

	public static java.sql.Timestamp getTimeStampByJavaDate(java.util.Date date) {
		if (date.equals(null) == false) {
			return new java.sql.Timestamp(date.getTime());
		} else {
			return null;
		}
	}

	/**
	 * Récupérer le style CSS lié à la dernière variation de la valeur
	 * Si la bourse est ouverte, retourne la variation entre la valeur actuelle et la cloture de la veille
	 * Sinon retourne la variation entre les deux fermetures
	 * 
	 * @param c
	 * @return
	 */
	public static Color styleVariationCours(Cotation c) {
		float var = variationCoursFloat(c);
		
		// Le cours est jugé constant
		if ((var > -1 * Const.PAS_DE_VARIATION) && (var < Const.PAS_DE_VARIATION)) {
			return Const.VARIATION_NEUTRE;
		}
		
		// Le cours a augmenté significativement
		else if (var > Const.PAS_DE_VARIATION) {
			return Const.VARIATION_POSITIVE;
		}
		
		// Le cours a baissé significativement
		else {
			return Const.VARIATION_NEGATIVE;
		}
	}

	/**
	 * La variation d'un cours par rapport à sa clotûre la veille
	 * 
	 * @param c
	 * @return
	 */
	public static float variationCoursFloat(Cotation c) {

		float coursN, coursNmoins1;
		float variationCours = 0;

		if (c.getHistoriques().size() > 1) {

			/**
			 * Si le dernier historique date de ce jour on le récupère,
			 * sinon on prend la dernière cloture 
			 */
			coursN = c.getLastValeur();
			
			// le dernier cours est celui de la veille, à la clotûre 
			if (coursN == c.getHistoriques().get(c.getHistoriques().size() - 1).getFermeture()) {
				coursNmoins1 = c.getHistoriques().get(c.getHistoriques().size() - 2).getFermeture();
				
				System.out.println("coursNMoins1 historique : " + coursNmoins1);
			}
			else {
				coursNmoins1 = c.getHistoriques().get(c.getHistoriques().size() - 1).getFermeture();
				
				System.out.println("coursNMoins1 intraday : " + coursNmoins1);
			}
			
			float var = 100 * (coursN - coursNmoins1) / coursNmoins1;
			
			variationCours = (float) (Math.round(var * 100.0) / 100.0);
		}

		return variationCours;
	}

	/**
	 * La variation d'un cours par rapport à sa clotûre la veille
	 * 
	 * @param c
	 * @return
	 */
	public static String variationCoursString(Cotation c) {

		float variation = variationCoursFloat(c);

		
		String variationCours = Float.toString(variation) + " %";

		if (variation > 0) {
				variationCours = "+" + variationCours;
		}

		return variationCours;
	}

	public static Date getToday()
	{
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal.getTime();
	}
	
	public static String getDateForSql(Date date)
	{
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		return formatter.format(date);
	}
}
